Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-585-1
gp Kapitel 4 Das Klassendesign (Teil 1)
  gp 4.1 Einführung in die Objektorientierung
    gp 4.1.1 Das objektorientierte Paradigma
    gp 4.1.2 Vorteile der objektorientierten Programmierung
    gp 4.1.3 Zusammenfassung
  gp 4.2 Die Klassendefinition
    gp 4.2.1 Die Deklaration von Objektvariablen
    gp 4.2.2 Zugriffsmodifizierer einer Klasse
    gp 4.2.3 Der Projekttyp »Klassenbibliothek«
    gp 4.2.4 Splitten einer Klassendefinition mit »Partial«
    gp 4.2.5 Zusammenfassung
  gp 4.3 Objektmethoden
    gp 4.3.1 Methoden mit Rückgabewert
    gp 4.3.2 Methoden ohne Rückgabewert
    gp 4.3.3 Der Aufruf einer Methode
    gp 4.3.4 Methoden mit Parameterliste
    gp 4.3.5 Rückgabewert einer Methode
    gp 4.3.6 Variablen in einer Methode
    gp 4.3.7 Zugriffsmodifizierer einer Methode
    gp 4.3.8 Referenz- und Wertparameter
    gp 4.3.9 Parameter, die Objektreferenzen erwarten
    gp 4.3.10 Methodenüberladung
    gp 4.3.11 Optionale Parameter
    gp 4.3.12 Zusammenfassung
  gp 4.4 Objekteigenschaften
    gp 4.4.1 Ergänzung der Klasse »Circle«
    gp 4.4.2 Lese- und schreibgeschützte Eigenschaften
    gp 4.4.3 Die Parameterliste einer Property-Prozedur
    gp 4.4.4 Standardeigenschaften
    gp 4.4.5 Das With ... End With-Statement
    gp 4.4.6 Konstanten mit »Const« und »ReadOnly«
    gp 4.4.7 Der Zugriff auf private Daten
    gp 4.4.8 Zusammenfassung
  gp 4.5 Konstruktoren
    gp 4.5.1 Die Konstruktoren in der Klasse »Circle«
    gp 4.5.2 Die Konstruktoraufrufe
    gp 4.5.3 Definition von Konstruktoren
    gp 4.5.4 »Friend«-Konstruktoren
    gp 4.5.5 »Private«-Konstruktoren
    gp 4.5.6 Konstruktorverkettung
    gp 4.5.7 Zusammenfassung
  gp 4.6 Der Destruktor
    gp 4.6.1 Das Zerstören von Objekten
    gp 4.6.2 Der Garbage Collector
    gp 4.6.3 Zusammenfassung
  gp 4.7 Arbeiten mit Objektreferenzen
    gp 4.7.1 Prüfen auf Initialisierung
    gp 4.7.2 Mehrere Referenzen auf ein Objekt
    gp 4.7.3 Typfeststellung einer Objektreferenz
    gp 4.7.4 Zusammenfassung


Galileo Computing

4.7 Arbeiten mit Objektreferenzen  downtop


Galileo Computing

4.7.1 Prüfen auf Initialisierung  downtop

Der Zustand einer Objektvariablen, die nicht initialisiert ist, wird durch Nothing beschrieben. Ist man sich über den Zustand einer Objektvariablen im Unklaren, kann dieser mit der Funktion IsNothing überprüft werden.


Dim obj As MyOwnClass If IsNothing(obj) Then Console.WriteLine("Kein gültiger Verweis.") End If

Der Aufruf von IsNothing liefert True als Rückgabe, falls die Objektvariable nicht initialisiert ist. Genau dies ist auch das Ergebnis des obigen Codefragments, da vor der Überprüfung keine Initialisierung mit dem New-Operator erfolgt.

Eine weitere Variante zur Prüfung auf Initialisierung wäre die folgende:


If Not (obj Is Nothing) Then
Console.WriteLine("Das Objekt ist initialisiert")
End If

Mit dem Erscheinen von Visual Basic 2005 wurde den Entwicklern zudem noch eine dritte Möglichkeit mit dem Schlüsselwort IsNot bereitgestellt:


If obj IsNot Nothing Then
...
End If


Galileo Computing

4.7.2 Mehrere Referenzen auf ein Objekt  downtop

Es kommt immer wieder vor, dass mehrere Referenzen auf das gleiche Objekt zeigen. Betrachten Sie dazu das folgende Codefragment:


Dim object1 As New ClassA
Dim object2 As ClassA
object2 = object1

In der ersten Zeile wird eine Variable des Typs ClassA deklariert und die Klasse instanziiert. Die Variable object2 ist ebenfalls vom Typ ClassA, jedoch nur deklariert und nicht initialisiert. In der dritten Anweisung wird die Referenz auf das Objekt object1 der Variablen object2 zugewiesen. Nach der Ausführung der dritten Codezeile liegt zwar nur ein Objekt vor, dieses kann allerdings über zwei Referenzen angesprochen werden.

Weisen Sie einem Feld des Objekts über eine der beiden Referenzen einen Wert zu, beispielsweise mit


object1.MypProp = 4711

könnten Sie folglich auch mit der zweiten Objektreferenz den Inhalt der Eigenschaft auslesen:


Console.WriteLine(object2.MyProp)

An der Konsole wird 4711 angezeigt, da die Variable object2 auf dasselbe Objekt verweist wie die Variable object1. Wird ein Objekt mehrfach referenziert, spielt es demnach keine Rolle, über welche Referenz der Eigenschaft ein Wert zugewiesen bzw. ein Feld ausgelesen wird – die Operation wird auf demselben konkreten Objekt ausgeführt.

Eine Mehrfachreferenzierung hat auch noch weitere Konsequenzen: Geben Sie eine der Referenzen mit Nothing frei, wird das Objekt nicht zerstört, weil eine andere, gültige Referenz immer noch das Weiterleben des Objekts garantiert.


Dim object1 As New ClassA
Dim obejct2 As ClassA
object2 = object1
object1.MyProp = 4711
object1 = Nothing
Console.WriteLine(object2.MyProp)

An der Konsole würde in diesem Fall immer noch der Inhalt der Eigenschaft MyProp ausgegeben. Erst mit der Freigabe der letzten Referenz auf eine Klasseninstanz wird das Objekt aufgegeben und kann zu einem späteren Zeitpunkt von der Speicherbereinigung erfasst werden.


Galileo Computing

4.7.3 Typfeststellung einer Objektreferenz  downtop

Sie werden sehr häufig in die Situation kommen, den Typ einer Objektreferenz zu ermitteln. Die sprachspezifische Funktion TypeName von Visual Basic ist dazu geeignet. Wie diese benutzt wird, demonstriert das folgende Beispiel:


If TypeName(myObj) = "ResultSet" Then
Console.WriteLine("Volltreffer")
End If

Hinsichtlich der Performance sind Stringvergleiche allerdings eine schlechte Wahl. Leistungsmäßig besser wird der Einsatz des TypeOf ... Is-Operators ausfallen. Der Operator liefert als Rückgabewert True, wenn der Typ des unter Objektname angegebenen Objekts der Angabe unter Typname entspricht oder von diesem abgeleitet ist.


If TypeOf myObj Is ClassA Then
Console.WriteLine("Es handelt sich um ein ClassA-Objekt.")
End If

TypeOf ... Is kann nur auf Referenztypen eingesetzt werden und ist daher ungeeignet, um festzustellen, ob der zugrunde liegende Typ einer Variablen beispielsweise Integer oder Long ist, die beide bekanntlich Wertetypen beschreiben. Der folgende Code ist daher syntaktisch nicht korrekt:


' Fehlerhafte Typüberprüfung
Dim intVar As Integer
If TypeOf intVar Is Integer Then
Console.WriteLine("Typ = Integer")
End If

Wie kann man aber dieses Dilemma vermeiden, wenn der Datentyp eines Wertetyps festgestellt werden muss?

Ein kleiner Trick ist notwendig, um die Laufzeitumgebung zu überlisten. Dazu muss man wissen, dass die Laufzeitumgebung in der Lage ist, einen Wertetypen im Bedarfsfall in einen Referenztypen umzuwandeln. Dieser Vorgang, dessen genaue Erklärung auf einen späteren Zeitpunkt verschoben wird, wird als Boxing bezeichnet. Sehen Sie sich dazu den folgenden Code an:


Sub Main()
Dim intVar As Integer
GetVariableType(intVar)
Console.ReadLine()
End Sub
Sub GetVariableType(ByVal testObj As Object)
If TypeOf testObj Is Object Then
Console.WriteLine("Typ = Object")
End If
If TypeOf testObj Is Integer Then
Console.WriteLine("Typ = Integer")
End If
End Sub

In Main wird die Variable intVar vom Typ Integer deklariert. Dabei handelt es sich um einen Wertetyp, der mit TypeOf ... Is nicht direkt untersucht werden kann, weil dieser Operator nur mit Referenztypen arbeitet. Der Trick steckt in der Definition der Methode GetVariableType, die ein Argument vom Typ Object erwartet. Da alle .NET-Klassen aus diesem Typ abgeleitet sind (sogar die nativen Datentypen), akzeptiert die Laufzeitumgebung die Übergabe eines Integers. Object selbst ist ein Referenztyp, deshalb muss der Wertetyp Integer von der Common Language Runtime implizit als Referenztyp betrachtet werden. Die damit verbundene Umwandlung ist als das weiter oben erwähnte Boxing bekannt.

Der Aufruf der Methode GetVariableType verursacht keinen Fehler und wird als Resultat zwei Ausgaben an der Konsole nach sich ziehen:


Typ = Object
Typ = Integer

Damit ist erwiesen, dass ein Wertetyp in den Referenztyp Object geboxt werden kann. Mit dieser Technik, den Parameter einer Methode typallgemein zu deklarieren und einen abgeleiteten Typ als Argument zu übergeben, eröffnen sich weitere programmiertechnische Möglichkeiten, die auch im weiteren Verlauf dieses Buches immer wieder angewendet werden.

Der Sonderfall: Ein String-Vergleich

Es gibt einen Sonderfall, der aus dem Rahmen unserer bisherigen Ausnahmen fällt und deshalb auch einer gesonderten Betrachtung unterzogen werden muss: Zeichenfolgen vom Datentyp String. Das zu verdeutlichen ist die Aufgabe des folgenden Beispielprogramms.


' ----------------------------------------------------------
' Beispiel: ...\Kapitel 4\StringVergleich
' ----------------------------------------------------------
Module Module1
Sub Main()
Dim str1 As String = "Hallo Welt"
Dim str2 As String = "Hallo Welt"
If str1 Is str2 Then
Console.WriteLine("Beide Strings sind gleich")
Else
Console.WriteLine("Die Strings sind ungleich")
End If
Console.ReadLine()
End Sub
End Module

Es sind zwei Objektvariablen vom Typ String deklariert, und demnach sollte erwartungsgemäß in den Else-Zweig der bedingten Anweisung gesprungen werden. Dem ist aber nicht so, denn tatsächlich wird an der Konsole


Beide Strings sind gleich

ausgegeben. Wie kann dieses Phänomen erklärt werden?

Es ist zunächst einmal festzuhalten, dass der Typ String ein Referenztyp ist. Folglich ist der Einsatz des Is-Operators gerechtfertigt. Stringvariablen unterscheiden sich aber von den Variablen anderer Typen: Sie können nicht verändert werden. Die folgenden beiden Codezeilen sollen das erklären:


Dim str1 As String = "Hallo Welt"
str1 = "Hallo Welt und guten Morgen"

In der ersten Zeile wird eine Variable vom Typ String deklariert und initialisiert, in der zweiten Zeile wird ihr ein neuer Inhalt zugewiesen. Tatsächlich wird aber der alte Inhalt nicht überschrieben, sondern eine neue Speicheradresse reserviert, der Zeiger von der alten Adresse mit dem Inhalt »Hallo Welt« auf die neue Adresse umgebogen und der neue Inhalt »Hallo Welt und guten Morgen« hineingeschrieben.

Definitiv arbeitet dieser Code also tatsächlich mit zwei unterschiedlichen Speicheradressen, auch wenn wir als Anwender davon nichts bemerken. Dieses Verhalten scheint nicht sehr effizient zu sein, denn Operation kostet zweifelsfrei Systemleistung. Dennoch muss es einen Vorteil geben. Dieser kommt zum Tragen, wenn mehrere Stringvariablen denselben Inhalt haben, denn unveränderliche Strings sind auch für die gemeinsame Nutzung eingerichtet. Das ist im obigen Beispiel StringVergleich der Fall und wird durch das Ausgabeergebnis an der Konsole auch bewiesen: str1 und str2 verweisen auf dieselbe Speicheradresse, weil sie denselben Inhalt beschreiben.


Galileo Computing

4.7.4 Zusammenfassung  toptop

gp  Nichtinitialisierte Objektreferenzen werden durch Nothing beschrieben. Die Prüfung, ob eine Referenz initialisiert ist, kann mit der Funktion IsNothing unter der Übergabe der zu prüfenden Referenz erfolgen.
gp  Um den Typ eines Objekts festzustellen, bietet sich die Funktion TypeName an, die den Klassennamen als Zeichenfolge zurückliefert.
gp  Mit TypeOf ... Is lässt sich der Typ einer Klasse in einer bedingten Anweisung überprüfen. Wertetypen sind von dieser Überprüfung ausgeschlossen. Der Rückgabewert ist vom Typ Boolean.
gp  Eine weitere Variante des Refernzvergleichs bietet der Operator Is, der auf zwei Operanden vom Typ einer Referenz arbeitet.
gp  Für Variablen vom Typ String gelten besondere Bedingungen. Daher ist der Referenzvergleich von String-Objekten ungeeignet.

 

 <<   zurück
  
  Zum Katalog
Zum Katalog: Visual Basic 2005
Visual Basic 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2005






 Visual C# 2005


Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Das Programmierhandbuch SQL Server 2005






 Das Programmier-
 handbuch
 SQL Server 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de